package com.co.notaweb.util;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.HashMap;

public class ServiceLocator {
	/**
	 * Singleton Instance of this class
	 */
	private static ServiceLocator serviceLocator = null;

	/**
	 * InitialContext object
	 */
	InitialContext context = null;

	/**
	 * Cache where the objects can be stored for later retrieval. This enhances
	 * the performance.
	 */
	HashMap serviceCache = null;

	/**
	 * Constructor to initialize the class
	 * 
	 * @exception NamingException
	 *                In case an exception is generated
	 */
	public ServiceLocator() throws NamingException {
		// Start the initial context
		context = new InitialContext();
		// Initialize the HashMap to store 5 objects
		serviceCache = new HashMap(5);
	}

	/**
	 * Returns the singleton instance
	 * 
	 * @exception NamingException
	 *                In case an exception is generated
	 * @return Singleton Instance
	 */
	public synchronized static ServiceLocator getInstance()
			throws NamingException {
		if (serviceLocator == null) {
			// If the object is not created, then create it
			serviceLocator = new ServiceLocator();
		}

		// Return the singleton instance
		return serviceLocator;
	}

	/**
	 * This is the method that returns the service
	 * 
	 * @param jndiName
	 *            JNDI Lookup needed for invoking the service
	 * @exception NamingException
	 *                In case an exception is generated
	 * @return Service Object
	 */
	public Object getServiceLocal(String jndiName) throws NamingException {
		if (!serviceCache.containsKey(jndiName)) {
			// If the object is not saved in the cache, then do a
			// lookup and save it
			serviceCache.put(jndiName, context.lookup(jndiName));
		}
		// Return the required object
		return serviceCache.get(jndiName);
	}

}
